import { defineStore } from 'pinia'
import type {
  LoginFormData,
  LoginResponseData,
  UserInfoData,
} from '@/api/user/type'
import { reqLogin, reqUserInfo } from '@/api/user'
import {
  SET_TOKEN,
  GET_TOKEN,
  SET_USERINFO,
  GET_USERINFO,
  DELETE_TOKEN,
  DELETE_USERINFO,
} from '@/utils/token'
import { constantRoutes } from '@/router/routes'
import { ref } from 'vue'

// 用户数据仓库
export default defineStore('user', () => {
  // 用户token对象
  let token = ref<LoginResponseData>(GET_TOKEN())
  // 路由对象
  let routes = constantRoutes
  // 用户信息
  // 这里 GET_USERINFO() 只是定义 userInfo 初始化值的方法；和 let userInfo = {}一样
  // ！！！另外注意， import 的时候必须 import useUserStore ;且使用的时候 必须是 const userStore = useUserStore()；否则浏览器开发工具组件中看不到该变量
  let userInfo = ref(GET_USERINFO())

  async function userLogin(data: LoginFormData) {
    let response = await reqLogin(data)
    if (response.code == 200) {
      token.value = response.data
      // 额外存储到硬盘上
      SET_TOKEN(response.data)
      return response.data
      // 下面这种也行
      // return Promise.resolve(response.data)
    } else {
      // 注意此处的写法
      return Promise.reject(new Error(response.message))
    }
  }

  async function getUserInfo(phone: string) {
    let response = await reqUserInfo(phone)
    if (response.code == 200) {
      userInfo.value = response.data
      // 额外存储到硬盘上
      SET_USERINFO(response.data)
      return response.data
    } else {
      return Promise.reject(new Error(response.message))
    }
  }

  async function logout() {
    token.value = {}
    userInfo.value = {}
    DELETE_TOKEN()
    DELETE_USERINFO()
  }

  return { token, routes, userLogin, getUserInfo, userInfo, logout }
})
